#include "FinalCType/String.h"
#include "FinalCType/File.h"

#include <stdio.h>

// 测试 FinalC 提供的 String 操作
void testString() {
    // String *s = createString(); destroyString(s);
    // String *s = createStringWith_cstr("fuck"); destroyString(s);
    // String *s = createStringWith_copy_cstr("copy fuck"); deleteString(s);

    // 创建空的String、追加字符串等操作
    String *s = createString();
    stringAppend_cstr(s, "fuck");
    stringAppend_cstr(s, " ");
    stringAppend_cstr(s, "you");

    printf("%s(%d)\n", s->value, s->len);
    // fuck you(8)
}

////////////////////////////////////////////////////////////////////////////////////

/**
 * @brief  使用 FinalC 建立一个标准的自定义结构体
 * @note   需要 FinalC_Object_Size 以自动填充 <Obj>Size()、conv<Obj>(void*) 函数
 * 需要 FinalC_Object_Create(自动)或 FinalC_Object_Create_Define 手动处理结构体时的初始化操作
 * @retval 
 */
FinalC_Object_Define(Person) {
    char name[100];
    int age;
};
FinalC_Object_Size(Person);   // 提供 PersonSize()、convPerson(void*) 
FinalC_Object_Create(Person); // 提供 createPerson()

// Person 变种规则
// createPersion With Initialize
Person *createPersonWithInitialize(char *name, int age) {
    Person *p = createPerson();
    strcpy(p->name, "ffashion");
    p->age = 35;
    return p;;
}

// 测试使用 自定义的 Person 结构体
void testPersion() {
    // 基本的创建结构体
    // Person *p = createPerson();
    // strcpy(p->name, "ffashion");
    // p->age = 35;

    // Person 变种规则 With Suffix -> 
    Person *p = createPersonWithInitialize("ffashion", 35);

    printf("%s 已经 %d 了\n", p->name, p->age);
    // ffashion 已经 35 了
}

////////////////////////////////////////////////////////////////////////////////////

// 测试 FinalC 提供的 File， 函数操作封装，增加使用 After 操作函数，用于直接销毁已使用过的String
void fileWriteWithStringAfter(File *f, String *s, afterdeleteString after) {
    fileWriteWithString(f, s);
    if (after == deleteString || after == destroyString) {
        after(s);
    }
}

// 测试 FinalC 提供的 File，程序输出文件应该在 build 目录下
void testFile() {
    File *f = createFileWith_cstr("name.list");
    fileWriteWithStringAfter(f, createStringWith_copy_cstr("ffashion 已经 35 了"), deleteString);
}

int	main(int argc, char **argv)
{
    // testString();
    // testPersion();

    testFile();
    
    return 0;
}
